package com.demo.java.OD351_400.OD369;

import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Scanner;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【Boss的收入(B卷)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146227351
 */
public class OdMain {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt(); // 读取部门数量

        HashMap<Integer, LinkedList<Integer>> graph = new HashMap<>(); // 存储树结构
        HashMap<Integer, Integer> moneyMap = new HashMap<>(); // 存储每个部门的收入
        HashSet<Integer> visitedNodes = new HashSet<>(); // 存储访问过的部门

        // 读取每个部门的父子关系及收入
        for (int i = 0; i < n; i++) {
            int nodeId = scanner.nextInt(); // 部门 ID
            int parentNodeId = scanner.nextInt(); // 上级部门 ID
            int amount = scanner.nextInt(); // 收入
            moneyMap.put(nodeId, amount);

            // 将每个部门加入其父部门的子部门列表
            LinkedList<Integer> children = graph.getOrDefault(parentNodeId, new LinkedList<>());
            children.add(nodeId);
            graph.put(parentNodeId, children);

            visitedNodes.add(nodeId); // 标记部门已访问
        }

        // 找到根节点，即 boss
        int rootId = findRootNode(graph, visitedNodes);

        // 计算 rootId（boss） 的总收入
        int totalMoney = calculateTotalMoney(rootId, graph, moneyMap);
        System.out.println(rootId + " " + totalMoney); // 输出 boss 的 ID 和总收入
    }

    // 找到根节点（boss）
    private static int findRootNode(HashMap<Integer, LinkedList<Integer>> graph, HashSet<Integer> visitedNodes) {
        int rootId = -1;
        for (Integer nodeId : graph.keySet()) {
            if (!visitedNodes.contains(nodeId)) { // 没有父节点的部门即为根节点（boss）
                rootId = nodeId;
                break;
            }
        }
        return rootId;
    }

    // 计算某个节点的总收入
    private static int calculateTotalMoney(int nodeId, HashMap<Integer, LinkedList<Integer>> graph, HashMap<Integer, Integer> moneyMap) {
        if (!graph.containsKey(nodeId)) { // 如果没有下属部门
            return (int) (moneyMap.get(nodeId) / 100) * 15; // 计算并返回收入
        }

        LinkedList<Integer> children = graph.get(nodeId);
        int totalMoney = 0;

        // 遍历所有下属部门，计算它们的收入
        for (int i = 0; i < children.size(); i++) {
            int childNodeId = children.get(i);
            totalMoney += calculateTotalMoney(childNodeId, graph, moneyMap);
        }

        // 累加当前部门的收入，并计算对应的奖金
        if (moneyMap.containsKey(nodeId)) {
            totalMoney += moneyMap.get(nodeId);
            return (int) (totalMoney / 100) * 15; // 计算总奖金
        }

        return totalMoney;
    }
}